import sequelize, { testConnection } from '@/config/database';
import { getLogger } from '@/utils/logger';

// 创建数据库检查专用的日志记录器
const logger = getLogger('db-check');

/**
 * 数据库健康检查工具
 * 用于应用启动时验证数据库连接
 */
export const checkDatabaseConnection = async (): Promise<void> => {
  try {
    // 测试数据库连接
    const isConnected = await testConnection();
    
    if (!isConnected) {
      logger.error('数据库连接失败，应用将退出');
      process.exit(1); // 非正常退出
    }
    
    // 检查表是否存在（示例）
    // 此处可以根据需要添加更多检查
    logger.info('数据库连接正常，准备就绪');
    
  } catch (error) {
    logger.error(`数据库检查出错: ${error instanceof Error ? error.message : String(error)}`);
    process.exit(1);
  }
};

/**
 * 定期检查数据库连接状态
 * @param interval 检查间隔时间（毫秒），默认5分钟
 */
export const startPeriodicDatabaseCheck = (interval: number = 5 * 60 * 1000): NodeJS.Timeout => {
  return setInterval(async () => {
    try {
      await sequelize.authenticate();
      logger.debug('数据库定期检查: 连接正常');
    } catch (error) {
      logger.error(`数据库定期检查: 连接失败! ${error instanceof Error ? error.message : String(error)}`);
      // 在这里可以添加重连逻辑或告警通知
    }
  }, interval);
};

/**
 * 优雅关闭数据库连接
 */
export const closeDatabase = async (): Promise<void> => {
  try {
    await sequelize.close();
    logger.info('数据库连接已安全关闭');
  } catch (error) {
    logger.error(`关闭数据库连接时出错: ${error instanceof Error ? error.message : String(error)}`);
  }
};

// 处理应用关闭信号
process.on('SIGINT', async () => {
  logger.info('接收到应用终止信号，正在关闭数据库连接...');
  await closeDatabase();
  process.exit(0);
});

process.on('SIGTERM', async () => {
  logger.info('接收到应用终止信号，正在关闭数据库连接...');
  await closeDatabase();
  process.exit(0);
}); 